package schach.server.controller;

import java.rmi.RemoteException;
import java.util.ArrayList;

import schach.GameController;
import schach.server.model.Bauer;
import schach.server.model.Brett;
import schach.server.model.Dame;
import schach.server.model.Feld;
import schach.server.model.Figur;
import schach.server.model.Koenig;
import schach.server.model.Laeufer;
import schach.server.model.Springer;
import schach.server.model.Turm;

public class GameControllerImpl implements GameController {

	private Brett brett;
	private boolean schwarzAmZug;

	public GameControllerImpl() {
		brett = new Brett();
		// Weiße Figuren
		this.figurenErstellen(false);
		// Schwarze Figuren
		this.figurenErstellen(true);
		schwarzAmZug = false;
	}

	public void figurenErstellen(boolean black) {
		int y;
		if (black)
			y = 7;
		else
			y = 0;

		Feld feld = new Feld(0, y);
		Figur figur = new Turm(feld, true, black);
		brett.setFigur(feld, figur);

		feld = new Feld(1, y);
		figur = new Springer(feld, true, black);
		brett.setFigur(feld, figur);

		feld = new Feld(2, y);
		figur = new Laeufer(feld, true, black);
		brett.setFigur(feld, figur);

		feld = new Feld(3, y);
		figur = new Dame(feld, true, black);
		brett.setFigur(feld, figur);

		feld = new Feld(4, y);
		figur = new Koenig(feld, true, black);
		brett.setFigur(feld, figur);

		feld = new Feld(5, y);
		figur = new Laeufer(feld, true, black);
		brett.setFigur(feld, figur);

		feld = new Feld(6, y);
		figur = new Springer(feld, true, black);
		brett.setFigur(feld, figur);

		feld = new Feld(7, y);
		figur = new Turm(feld, true, black);
		brett.setFigur(feld, figur);

		for (int i = 0; i < 8; i++) {
			if (black)
				feld = new Feld(i, y - 1);
			else
				feld = new Feld(i, y + 1);

			figur = new Bauer(feld, true, black);
			brett.setFigur(feld, figur);
		}
	}

	@Override
	public void macheZug(Feld von, Feld nach, boolean black) {
		Figur figur = null;
		ArrayList<Feld> crossed = new ArrayList<Feld>();
		boolean schlagen = false;

		// Überprüfen ob eine Figur an der Position vorhanden ist
		figur = brett.getFigur(von);

		

		// Hat die Figur die Farbe des Spielers, der am Zug ist?
		if (figur.isBlack() == schwarzAmZug) {
			
			if (brett.getFigur(nach) != null)
				schlagen = true;
			if (schlagen && (brett.getFigur(nach).isBlack() == figur.isBlack()))
				throw new NullPointerException();
			crossed = figur.crossedFields(nach, schlagen);
			if (crossed != null) {
				for (Feld felder : crossed) {
					if (brett.getFigur(felder) != null) {
						throw new NullPointerException();
					}
				}
			}
			figur.move(nach);
			brett.setFigur(nach, figur);
			brett.setFigur(von, null);
			schwarzAmZug = !schwarzAmZug;
			

		}
		else {
			if(schwarzAmZug){
				System.out.println("Schwarz ist am Zug!!!");
			}
			else{
				System.out.println("Weiß ist am Zug!!!");
			}
		}

	}

	@Override
	public Brett getBrett() throws RemoteException {
		return brett;
	}

}
